package core

import (
	"context"
	"fmt"
	"log"
	"net/http"

	"github.com/mark3labs/mcp-go/server"
)

// MCPServer 封装MCP服务器
type MCPServer struct {
	*mcpServer
}

type mcpServer struct {
	sseServer  *server.SSEServer
	tools      map[string]any
	handlers   map[string]func(context.Context, any) (any, error)
	httpServer *http.Server
}

// NewMCPServer 创建新的MCP服务器
func NewMCPServer() (*MCPServer, error) {
	// 创建服务器包装器
	ms := &mcpServer{
		tools:    make(map[string]any),
		handlers: make(map[string]func(context.Context, any) (any, error)),
	}

	return &MCPServer{ms},
		nil
}

// Start 启动MCP服务器
func (m *MCPServer) Start(port string) error {
	// 创建MCPServer实例
	mcpserver := server.NewMCPServer(
		"Docker Monitor MCP Server",
		"1.0.0",
		
	)

	// 添加tools/list工具到内部工具集合
	m.addToolsListTool()

	// 创建SSE服务器
	baseURL := fmt.Sprintf("http://localhost:%s", port)
	m.sseServer = server.NewSSEServer(mcpserver,
		server.WithBaseURL(baseURL),
		server.WithSSEEndpoint("/sse"),
		server.WithMessageEndpoint("/message"),
	)

	// 创建HTTP服务器
	m.httpServer = &http.Server{
		Addr:    fmt.Sprintf(":%s", port),
		Handler: m.sseServer,
	}

	// 启动服务器
	go func() {
		log.Printf("Starting MCP server on port %s", port)
		if err := m.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Printf("MCP server error: %v", err)
		}
	}()

	return nil
}

// Shutdown 优雅关闭MCP服务器
func (m *MCPServer) Shutdown(ctx context.Context) error {
	if m.httpServer != nil {
		log.Println("Shutting down MCP server...")
		return m.httpServer.Shutdown(ctx)
	}
	return nil
}

// AddTool 添加工具到MCP服务器
func (m *MCPServer) AddTool(tool any, handler func(context.Context, any) (any, error)) {
	// 将工具信息转换为map
	toolMap, ok := tool.(map[string]any)
	if !ok {
		return
	}

	// 获取工具名称
	toolName, ok := toolMap["name"].(string)
	if !ok {
		return
	}

	// 存储工具和处理函数
	m.tools[toolName] = tool
	m.handlers[toolName] = handler
}

// addToolsListTool 添加tools/list工具，用于获取所有已注册的工具
func (m *MCPServer) addToolsListTool() {
	listTool := map[string]any{
		"name":        "tools/list",
		"description": "获取所有已注册的工具列表",
	}

	// 注册工具处理函数
	m.tools["tools/list"] = listTool
	m.handlers["tools/list"] = func(ctx context.Context, request any) (any, error) {
		// 收集所有工具信息
		var toolsList []map[string]any
		for name, tool := range m.tools {
			toolMap, ok := tool.(map[string]any)
			if !ok {
				continue
			}

			// 创建工具信息副本，避免修改原数据
			toolInfo := make(map[string]any)
			for k, v := range toolMap {
				toolInfo[k] = v
			}
			toolInfo["name"] = name
			toolsList = append(toolsList, toolInfo)
		}

		// 返回工具列表
		return map[string]any{
			"tools": toolsList,
		}, nil
	}
}

// AddResource 添加资源到MCP服务器
func (m *MCPServer) AddResource(resource any, handler func(context.Context, any) (any, error)) {
	// 简化实现，忽略具体类型
	// 存储资源和处理函数
	resourceMap, ok := resource.(map[string]any)
	if !ok {
		return
	}

	// 获取资源URI
	resourceURI, ok := resourceMap["uri"].(string)
	if !ok {
		return
	}

	// 存储资源和处理函数
	m.tools[resourceURI] = resource
	m.handlers[resourceURI] = handler
}

// AddPrompt 添加提示词到MCP服务器
func (m *MCPServer) AddPrompt(prompt any, handler func(context.Context, any) (any, error)) {
	// 简化实现，忽略具体类型
	// 存储提示词和处理函数
	promptMap, ok := prompt.(map[string]any)
	if !ok {
		return
	}

	// 获取提示词名称
	promptName, ok := promptMap["name"].(string)
	if !ok {
		return
	}

	// 存储提示词和处理函数
	m.tools[promptName] = prompt
	m.handlers[promptName] = handler
}
